// 插件机制就是基于tapable来实现的

// 所有的构造函数都接收一个可选参数，参数是一个参数名的字符串数组
// 参数的名字可以任意填写，但是参数数组的长数必须要根实际接受的参数个数一致
// 如果回调函数不接受参数，可以传入空数组
// 在实例化的时候传入的数组长度长度有用，值没有用途
// 执行 call 时，参数个数和实例化时的数组长度有关
// 回调的时候是按先入先出的顺序执行的，先放的先执行
const { SyncHook } = require("../03.tapable手写"); //同步钩子
debugger
const hook = new SyncHook(["name", "age"]);
hook.tap("1", (name, age) => {
    console.log(1, name, age);
});
hook.tap({name:"2"}, (name, age) => {
    console.log(2, name, age);
});
hook.tap("3", (name, age) => {
    console.log(3, name, age);
});
hook.call("zhufeng", 10);//动态编译 出为一个call方法执行
hook.call("zhufeng", 10);//不再动态编译了，而是会执行上一次编译 出来的call方法
/* 
输出==>
1 zhufeng 10
2 zhufeng 10
3 zhufeng 10
1 zhufeng 10
2 zhufeng 10
3 zhufeng 10
 */


/*(function anonymous(name, age) {
    var _x = this._x;//this是钩子的实例 _x是事件函数的数组
    
    var _fn0 = _x[0];
    _fn0(name, age);
  
    var _fn1 = _x[1];
    _fn1(name, age);
  
    var _fn2 = _x[2];
    _fn2(name, age);
  })
   */
